import java.util.*;
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int row = matrix.length;    //行
        int col = matrix[0].length; //列
        return func(matrix, row, col, 0, 0, res);
    }

    public List<Integer> func(int[][] matrix, int row, int col, int i, int j, List<Integer> res) {
        if (row <= 0 || col <= 0) {
            return res;
        }

        //处理单行矩阵
        if (row == 1) {
            for (int k = 0; k < col; k++) {
                res.add(matrix[i][j++]);
            }
            return res;
        }

        //处理单列矩阵
        if (col == 1) {
            for (int k = 0; k < row; k++) {
                res.add(matrix[i++][j]);
            }
            return res;
        }

        // 从左到右
        for (int k = 0; k < col - 1; k++) {
            res.add(matrix[i][j++]);
        }

        // 从上到下
        for (int u = 0; u < row - 1; u++) {
            res.add(matrix[i++][j]);
        }

        // 从右到左
        for (int k = 0; k < col - 1; k++) {
            res.add(matrix[i][j--]);
        }

        // 从下到上
        for (int u = 0; u < row - 1; u++) {
            res.add(matrix[i--][j]);
        }

        // 递归处理内部矩阵
        return func(matrix, row - 2, col - 2, i + 1, j + 1, res);
    }

}


//力扣560. 和为 K 的子数组
class Solution1 {
    public int subarraySum(int[] nums, int k) {
        int temp=0;
        int res=0;
        Map<Integer,Integer> map=new HashMap<>();
        map.put(0,1);//可能出现: 0 0 0 0 0...的情况
        for(int i=0;i<nums.length;i++){
            temp+=nums[i];
            if(map.containsKey(temp-k)){
                res+=map.get(temp-k);//注意不能直接res++，因为在此之前可能不止一个和为temp-k的值
            }
            map.put(temp,map.getOrDefault(temp,0)+1);//将当前下标的总和添加进map
        }
        return res;
    }
}